# 客户端设置
[client]
port = ${port}
# 默认情况下,socket文件应为/usr/local/mysql/mysql.socket,所以可以ln -s xx  /tmp/mysql.sock
socket  = ${sock}
# mysql命令行工具不使用自动补全功能,建议还是改为,有问题
#no-auto-rehash
#auto-rehash
default-character-set = ${character}
##########################################################################################################
[mysql]
default-character-set = ${character}
##########################################################################################################
# 服务端设置
[mysqld]

##########################################################################################################
# 基础信息
#Mysql服务的唯一编号,每个mysql服务Id需唯一
server-id = 1
#服务端口号 默认3306
port = ${port}
# 启动mysql服务进程的用户
user = mysql

# 修改mysql默认模式,5.7开始默认是严格模式,会导致MySQL数据库不允许插入零日期,插入零日期会抛出错误
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

##########################################################################################################
# 安装目录相关
# mysql安装根目录
basedir = ${basedir}
# mysql数据文件所在位置 不能直接使用 {datadir}
datadir = ${datadir}/data
# 临时目录 比如load data infile会用到,一般都是使用/tmp
tmpdir  = ${datadir}/tmp
# 设置socke文件地址
socket  = ${sock}
pid_file = ${pidfile}
##########################################################################################################
# 数据库引擎与字符集相关设置

# mysql 5.1 之后,默认引擎就是InnoDB了
#default_storage_engine = InnoDB
# 内存临时表默认引擎,默认InnoDB
#default_tmp_storage_engine = InnoDB
# mysql 5.7新增特性,磁盘临时表默认引擎,默认InnoDB, 8.0无法识别该参数
#internal_tmp_disk_storage_engine = InnoDB

#数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character-set-server = ${character}

#数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server = ${character}_general_ci

# 设置client连接mysql时的字符集,防止乱码
# init_connect='SET NAMES ${character}'

# 是否对sql语句大小写敏感,默认值为0,1表示不敏感
lower_case_table_names = 1

##########################################################################################################
# 数据库连接相关设置
# 最大连接数,可设最大值16384,一般考虑根据同时在线人数设置一个比较综合的数字
# 鉴于该数值增大并不太消耗系统资源,建议直接设10000
# 如果在访问时经常出现Too Many Connections的错误提示,则需要增大该参数值
#max_connections = 10000

# 默认值100,最大错误连接数,如果有超出该参数值个数的中断错误连接,则该主机将被禁止连接.
## 如需对该主机进行解禁,执行：FLUSH HOST
# 考虑高并发场景下的容错,建议加大.
#max_connect_errors = 10000

# MySQL打开的文件描述符限制,默认最小1024;
# 当open_files_limit没有被配置的时候,比较max_connections*5和ulimit -n的值,哪个大用哪个,
# 当open_file_limit被配置的时候,比较open_files_limit和max_connections*5的值,哪个大用哪个.
#open_files_limit = 65535
# 注意：仍然可能出现报错信息Can't create a new thread；此时观察系统cat /proc/mysql进程号/limits,观察进程ulimit限制情况
# 过小的话,考虑修改系统配置表,/etc/security/limits.conf和/etc/security/limits.d/90-nproc.conf

# MySQL默认的wait_timeout  值为8个小时, interactive_timeout参数需要同时配置才能生效
# MySQL连接闲置超过一定时间后(单位：秒,此处为1800秒)将会被强行关闭
interactive_timeout = 3600 
wait_timeout = 3600 

# 在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中 
# 官方建议back_log = 50 + (max_connections / 5),封顶数为900
#back_log = 900

##########################################################################################################
# 数据库数据交换设置- data packet
# 该参数限制服务器端,网络传输中一次消息传输量的最大值.系统默认值 为1MB,最大值是1GB,必须设置1024的倍数
# 如果有BLOB子段,建议增大此值,避免写入或者更新出错.有BLOB子段,建议改为1024M
max_allowed_packet = 128M

##########################################################################################################
# 内存,cache与buffer设置
# 内存临时表的最大值,默认16M,此处设置成128M
tmp_table_size = 128M
# 用户创建的内存表的大小,默认16M,往往和tmp_table_size一起设置,限制用户临师表大小.
# 超限的话,MySQL就会自动地把它转化为基于磁盘的MyISAM表,存储在指定的tmpdir目录下,增大IO压力,建议内存大,增大该数值.
max_heap_table_size = 128M

# 表示这个mysql版本是否支持查询缓存.ps：SHOW STATUS LIKE 'qcache%%',与缓存相关的状态变量.
# have_query_cache

####Query_cache里的数据又怎么处理呢？首先要把Query_cache和该表相关的语句全部置为失效,然后在写入更新.那么如果Query_cache非常大,该表的查询结构又比较多,查询语句失效也慢,一个更新或是Insert就会很慢,这样看到的就是Update或是Insert怎么这么慢了.所以在数据库写入量或是更新量也比较大的系统,该参数不适合分配过大.而且在高并发,写入量大的系统,建议把该功能禁掉.

# 这个系统变量控制着查询缓存工能的开启的关闭,0时表示关闭,1时表示打开,2表示只要select 中明确指定SQL_CACHE才缓存.
# 看业务场景决定是否使用缓存,不使用,下面就不用配置了.
#query_cache_type = 0 

# 默认值1M,优点是查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表.
# 缺点：在你表经常变化的情况下或者如果你的查询原文每次都不同,查询缓冲也许引起性能下降而不是性能提升.
#query_cache_size = 64M 

# 只有小于此设定值的结果才会被缓冲,保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖.
#query_cache_limit = 2M

# 每个被缓存的结果集要占用的最小内存,默认值4kb,一般不怎么调整.
# 如果Qcache_free_blocks值过大,可能是query_cache_min_res_unit值过大,应该调小些
# query_cache_min_res_unit的估计值：(query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache
#query_cache_min_res_unit = 4kb

#*** MyISAM 相关选项 ###################################
# 指定索引缓冲区的大小, 为MYISAM数据表开启供线程共享的索引缓存,对INNODB引擎无效.相当影响MyISAM的性能.
# 不要将其设置大于你可用内存的30%%,因为一部分内存同样被OS用来缓冲行数据
# 甚至在你并不使用MyISAM 表的情况下, 你也需要仍旧设置起 8-64M 内存由于它同样会被内部临时磁盘表使用.
# 默认值 8M,建议值：对于内存在4GB左右的服务器该参数可设置为256M或384M.注意：该参数值设置的过大反而会是服务器整体效率降低！
#key_buffer_size = 64M

# 为每个扫描MyISAM的线程分配参数设置的内存大小缓冲区. 
# 默认值128kb,建议值：16G内存建议1M,4G：128kb或者256kb吧
# 注意,该缓冲区是每个连接独占的,所以总缓冲区大小为 128kb*连接数；极端情况128kb*maxconnectiosns,会超级大,所以要考虑日常平均连接数.
# 一般不需要太关心该数值,稍微增大就可以了,
#read_buffer_size = 262144 

# 支持任何存储引擎
# MySQL的随机读缓冲区大小,适当增大,可以提高性能.
# 默认值256kb；建议值：得参考连接数,16G内存,有人推荐8M
# 注意,该缓冲区是每个连接独占的,所以总缓冲区大小为128kb*连接数；极端情况128kb*maxconnectiosns,会超级大,所以要考虑日常平均连接数.
#read_rnd_buffer_size = 1M

# order by或group by时用到 
# 支持所有引擎,innodb和myisam有自己的innodb_sort_buffer_size和myisam_sort_buffer_size设置
# 默认值256kb；建议值：得参考连接数,16G内存,有人推荐8M.
# 注意,该缓冲区是每个连接独占的,所以总缓冲区大小为1M*连接数；
# 极端情况1M*maxconnectiosns,会超级大.所以要考虑日常平均连接数.
#sort_buffer_size = 1M

# 此缓冲被使用来优化全联合(full JOINs 不带索引的联合)
# 类似的联合在极大多数情况下有非常糟糕的性能表现,但是将此值设大能够减轻性能影响.
# 通过 “Select_full_join” 状态变量查看全联合的数量
# 注意,该缓冲区是每个连接独占的,所以总缓冲区大小为 1M*连接数；极端情况1M*maxconnectiosns,会超级大.所以要考虑日常平均连接数.
# 默认值256kb;建议值：16G内存,设置8M.
#join_buffer_size = 1M

# 缓存linux文件描述符信息,加快数据文件打开速度
# 它影响myisam表的打开关闭,但是不影响innodb表的打开关闭.
# 默认值2000,建议值：根据状态变量Opened_tables去设定
#table_open_cache = 2000

# 缓存表定义的相关信息,加快读取表信息速度
# 默认值1400,最大值2000,建议值：基本不改.
#table_definition_cache = 1400
# 该参数是myssql 5.6后引入的,目的是提高并发.
# 默认值1,建议值：cpu核数,并且<=16
#table_open_cache_instances = 2

# 当客户端断开之后,服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁.可重用,减小了系统开销.
# 默认值为9,建议值：两种取值方式,方式一,根据物理内存,1G  —> 8；2G  —> 16； 3G  —> 32； >3G  —> 64；
# 方式二,根据show status like  'threads%%',查看Threads_connected值.
thread_cache_size = 16

# 默认值256k,建议值：16/32G内存,512kb,其他一般不改变,如果报错：Thread stack overrun,就增大看看,
# 注意,每个线程分配内存空间,所以总内存空间...你懂得.
#thread_stack = 512k

##########################################################################################################
# 日志文件相关设置,一般只开启三种日志,错误日志,慢查询日志,二进制日志.普通查询日志不开启.

# 普通查询日志,默认值off,不开启
general_log = 0
# 普通查询日志存放地址
general_log_file = ${logdir}/general.log

# 全局动态变量,默认3,范围：1～3
# 表示错误日志记录的信息,1：只记录error信息；2：记录error和warnings信息；3：记录error、warnings和普通的notes信息.
log_error_verbosity = 2
# 错误日志文件地址
log_error = ${elogdir}/mysql.err

# 开启慢查询
slow_query_log = 1
# 开启慢查询时间,此处为1秒,达到此值才记录数据
long_query_time = 3
# 检索行数达到此数值,才记录慢查询日志中
min_examined_row_limit = 100
# mysql 5.6.5新增,用来表示每分钟允许记录到slow log的且未使用索引的SQL语句次数,默认值为0,不限制.
log_throttle_queries_not_using_indexes = 0
# 慢查询日志文件地址
slow_query_log_file = ${elogdir}/slow.log
# 开启记录没有使用索引查询语句
log-queries-not-using-indexes = 1

# 开启二进制日志
log_bin = ${blogdir}/mysql-bin.log
# mysql清除过期日志的时间,默认值0,不自动清理,而是使用滚动循环的方式.
expire_logs_days = 0
# 如果二进制日志写入的内容超出给定值,日志就会发生滚动.你不能将该变量设置为大于1GB或小于4096字节. 默认值是1GB.
max_binlog_size = 1000M
# binlog的格式也有三种：STATEMENT,ROW,MIXED.mysql 5.7.7后,默认值从 MIXED 改为 ROW
# 关于binlog日志格式问题,请查阅网络资料
binlog_format = row
# 默认值N=1,使binlog在每N次binlog写入后与硬盘同步,ps：1最慢
# sync_binlog = 1 
# 在一个事务中binlog为了记录SQL状态所持有的cache大小
# 如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能.
# 所有从事务来的状态都将被缓冲在binlog缓冲中然后在提交后一次性写入到binlog中
# 如果事务比此值大, 会使用磁盘上的临时文件来替代.
# 此缓冲在每个连接的事务第一次更新状态时被创建
binlog_cache_size = 1M


##########################################################################################################
# innodb选项

# 说明：该参数可以提升扩展性和刷脏页性能.
# 默认值1,建议值：4-8；并且必须小于innodb_buffer_pool_instances
innodb_page_cleaners = 4

# 说明：一般8k和16k中选择,8k的话,cpu消耗小些,selcet效率高一点,一般不用改
# 默认值：16k；建议值：不改,
#innodb_page_size = 16384

# 说明：InnoDB使用一个缓冲池来保存索引和原始数据, 不像MyISAM.这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少.
# 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的60%%-80%%
# 注意别设置的过大,会导致system的swap空间被占用,导致操作系统变慢,从而减低sql查询的效率
# 默认值：128M,建议值：物理内存的60%%-80%%
innodb_buffer_pool_size = 512M

# 说明:只有当设置 innodb_buffer_pool_size 值大于1G时才有意义,小于1G,instances默认为1,大于1G,instances默认为8
# 但是网络上有评价,最佳性能,每个实例至少1G大小.
# 默认值：1或8,建议值：innodb_buffer_pool_size/innodb_buffer_pool_instances >= 1G
#innodb_buffer_pool_instances = 1

# 说明：mysql 5.7 新特性,defines the chunk size for online InnoDB buffer pool resizing operations.
# 实际缓冲区大小必须为innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances*倍数,取略大于innodb_buffer_pool_size
# 默认值128M,建议值：默认值就好,乱改反而容易出问题,它会影响实际buffer pool大小.
#innodb_buffer_pool_chunk_size = 128M 

# 在启动时把热数据加载到内存.默认值为on,不修改
#innodb_buffer_pool_load_at_startup = 1
# 在关闭时把热数据dump到本地磁盘.默认值为on,不修改
#innodb_buffer_pool_dump_at_shutdown = 1

# 说明：影响Innodb缓冲区的刷新算法,建议从小到大配置,直到zero free pages；innodb_lru_scan_depth * innodb_buffer_pool_instances defines the amount of work performed by the page cleaner thread each second.
# 默认值1024,建议值: 未知
#innodb_lru_scan_depth = 1024

# 说明：事务等待获取资源等待的最长时间,单位为秒,看具体业务情况,一般默认值就好
# 默认值：50,建议值：看业务.
innodb_lock_wait_timeout = 120

# 说明：设置了Mysql后台任务(例如页刷新和merge dadta from buffer pool)每秒io操作的上限.
# 默认值：200,建议值：方法一,单盘sata设100,sas10,raid10设200,ssd设2000,fushion-io设50000；方法二,通过测试工具获得磁盘io性能后,设置IOPS数值/2.
#innodb_io_capacity = 2000
# 说明：该参数是所有缓冲区线程io操作的总上限.
# 默认值：innodb_io_capacity的两倍.建议值：例如用iometer测试后的iops数值就好
#innodb_io_capacity_max = 4000

# 说明：控制着innodb数据文件及redo log的打开、刷写模式,三种模式：fdatasync(默认),O_DSYNC,O_DIRECT
# fdatasync：数据文件,buffer pool->os buffer->磁盘；日志文件,buffer pool->os buffer->磁盘；
# O_DSYNC：  数据文件,buffer pool->os buffer->磁盘；日志文件,buffer pool->磁盘；
# O_DIRECT： 数据文件,buffer pool->磁盘；           日志文件,buffer pool->os buffer->磁盘；
# 默认值为空,建议值：使用SAN或者raid,建议用O_DIRECT,不懂测试的话,默认生产上使用O_DIRECT
innodb_flush_method = O_DIRECT

# 说明：mysql5.7之后默认开启,意思是,每张表一个独立表空间.
# 默认值1,开启
innodb_file_per_table = 1

# 说明：The path where InnoDB creates undo tablespaces.通常等于undo log文件的存放目录.
# 默认值./;自行设置
#innodb_undo_directory = ${datadir}/data

# 说明：The number of undo tablespaces used by InnoDB.等于undo log文件数量.5.7.21后开始弃用
# 默认值为0,建议默认值就好,不用调整了.
#innodb_undo_tablespaces = 0
# 说明：定义undo使用的回滚段数量.5.7.19后弃用
# 默认值128,建议不动,以后弃用了.
#innodb_undo_logs = 128
# 说明：5.7.5后开始使用,在线收缩undo log使用的空间.
# 默认值：关闭,建议值：开启
innodb_undo_log_truncate = 1
# 说明：结合innodb_undo_log_truncate,实现undo空间收缩功能
# 默认值：1G,建议值,不改.
#innodb_max_undo_log_size = 1G

# 说明：重作日志文件的存放目录
#innodb_log_group_home_dir = ${datadir}/data

# 说明：日志文件的大小
# 默认值:48M,建议值：根据你系统的磁盘空间和日志增长情况调整大小
innodb_log_file_size = 128M
# 说明：日志组中的文件数量,mysql以循环方式写入日志
# 默认值2,建议值：根据你系统的磁盘空间和日志增长情况调整大小
innodb_log_files_in_group = 3
# 此参数确定些日志文件所用的内存大小,以M为单位.缓冲区更大能提高性能,但意外的故障将会丢失数据.MySQL开发人员建议设置为1－8M之间
innodb_log_buffer_size = 16M


# 说明：可以控制log从系统buffer刷入磁盘文件的刷新频率,增大可减轻系统负荷
# 默认值是1；建议值不改.系统性能一般够用.
#innodb_flush_log_at_timeout = 1
# 说明：参数可设为0,1,2；
# 参数0：表示每秒将log buffer内容刷新到系统buffer中,再调用系统flush操作写入磁盘文件.
# 参数1：表示每次事物提交,将log buffer内容刷新到系统buffer中,再调用系统flush操作写入磁盘文件.
# 参数2：表示每次事物提交,将log buffer内容刷新到系统buffer中,隔1秒后再调用系统flush操作写入磁盘文件.
innodb_flush_log_at_trx_commit = 1

# 说明：限制Innodb能打开的表的数据,如果库里的表特别多的情况,请增加这个.
# 值默认是2000,建议值：参考数据库表总数再进行调整,一般够用不用调整.
#innodb_open_files = 8192

# innodb处理io读写的后台并发线程数量,根据cpu核来确认,取值范围：1-64
# 默认值：4,建议值：与逻辑cpu数量的一半保持一致.
innodb_read_io_threads = 4
innodb_write_io_threads = 4
# 默认设置为 0,表示不限制并发数,这里推荐设置为0,更好去发挥CPU多核处理能力,提高并发量
#innodb_thread_concurrency = 0
# 默认值为4,建议不变.InnoDB中的清除操作是一类定期回收无用数据的操作.mysql 5.5之后,支持多线程清除操作.
#innodb_purge_threads = 4 

# 说明：mysql缓冲区分为new blocks和old blocks；此参数表示old blocks占比；
# 默认值：37,建议值,一般不动
#innodb_old_blocks_pct = 37
# 说明：新数据被载入缓冲池,进入old pages链区,当1秒后再次访问,则提升进入new pages链区.
# 默认值：1000
#innodb_old_blocks_time=1000
# 说明：开启异步io,可以提高并发性,默认开启.
# 默认值为1,建议不动
#innodb_use_native_aio = 1

# 说明：默认为空,使用data目录,一般不改.
#innodb_data_home_dir=
# 说明：Defines the name, size, and attributes of InnoDB system tablespace data files.
# 默认值,不指定,默认为ibdata1:12M:autoextend
#innodb_data_file_path = ibdata1:12M:autoextend

# 说明:设置了InnoDB存储引擎用来存放数据字典信息以及一些内部数据结构的内存空间大小,除非你的数据对象及其多,否则一般默认不改.
# innodb_additional_mem_pool_size = 16M

# 说明：The crash recovery mode.只有紧急情况需要恢复数据的时候,才改为大于1-6之间数值,含义查下官网.
# 默认值为0；
#innodb_force_recovery = 0

##########################################################################################################
# 其他....
# 参考http://www.kuqin.com/database/20120815/328905.html
# skip-external-locking

# 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间.
# 缺点：所有远程主机连接授权都要使用IP地址方式,因为只认得ip地址了.
skip_name_resolve = 0

# 默认值为off,timestamp列会自动更新为当前时间,设置为on|1,timestamp列的值就要显式更新
explicit_defaults_for_timestamp = 1

#忘记密码时使用
#skip-grant-tables
#设置协议认证方式(重点啊),有些工具不支持mysql8默认的协议方式
#default_authentication_plugin=mysql_native_password

##########################################################################################################
[mysqldump]
# quick选项强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中
quick
max_allowed_packet = 16M